ContentfulのAudit Logを有効化して監査ログを保存してみた
CMSのContentfulで、Audit Logs(監査ログ)の保存が可能になりました。
これまでは難しかった、ダッシュボードやAPIアクティビティのログが簡単に取得でき、意図しない操作の調査や対応が簡単になります。
この記事ではAudit Logsの概要、ログの内容、設定方法を紹介します。
Audit Logs でできること
ContentfulのOrganization内で行われたすべての変更を追跡できるようになります。
インシデントの調査や、関連するイベント (ロールの変更、ユーザーの招待、スペースの削除など) に関する詳細なレポートが取得できます。
ログはJSON形式です。
ログ保存先は自分で用意する必要があり、AWS S3バケットまたはAzure Blobストアが選択できます。
ログファイルの構造
イベント ログはOCSF標準に準拠しています。
ログの例
[{
"activity_name": "Update",
"activity_id": 3,
"category_uid": "6",
"class_uid": "6001",
"type_uid": "600103",
"time": "2024-12-23 23:37:50.174",
"actor": {
"type": "User",
"id": "36YHpi7oFmocMueVN6RVcb"
},
"enrichments": [
{
"name": "http_request.url.path",
"value": "/spaces/it0aopd16mqE/environments/master/entries/P8J72G9IxsBmVzquV3Qdd",
"type": "spaces",
"data": {
"id": "it0aopd16mqE"
}
},
{
"name": "http_request.url.path",
"value": "/spaces/it0aopd16mqE/environments/master/entries/P8J72G9IxsBmVzquV3Qdd",
"type": "environments",
"data": {
"id": "master"
}
},
{
"name": "http_request.url.path",
"value": "/spaces/it0aopd16mqE/environments/master/entries/P8J72G9IxsBmVzquV3Qdd",
"type": "entries",
"data": {
"id": "P8J72G9IxsBmVzquV3Qdd"
}
}
],
"severity_id": 0,
"http_request": {
"args": "",
"http_method": "PUT",
"referrer": "",
"url": {
"path": "/spaces/it0aopd16mqE/environments/master/entries/P8J72G9IxsBmVzquV3Qdd"
}
},
"http_response": {
"code": 200
},
"web_resources": [
{
"type": "Entry",
"uid": "P8J72G9IxsBmVzquV3Qdd"
}
],
"metadata": {
"version": "1.3.0",
"uid": "bd25f7ec-4e70-4f4f-885e-f370f7d0b5fd"
}
}, ...]
主要な属性
activity_id
...activity_name
とセットでイベントの種類(更新/削除/...)を表す(イベントごとのユニークIDではないので注意)category_uid
... イベントのカテゴリ。現時点では固定値6
=Application Activity
が返却されるhttp_request
... イベントの元になるHTTPリクエスト。リクエストメソッド、対象パスなどを含むhttp_response
... リクエストに対して返却された成功ステータスなどenrichments
... リクエスト対象リソースの構造化された詳細。上記例では対象Space, Environment, Entry情報が格納されているseverity_id
... 数値が小さいほど重大度が低い。現時点では固定値0
が返却される
ログファイルの命名規則
audit-log-{organization_id}-{date}-{timestamp}.json
配信タイミング
ドキュメントでは「毎日」の配信となっています。
私のOrganizationの場合、毎日 04:00 AM (UTC) 頃に配信されていました。
設定の流れ
Amazon S3を使って設定してみました。
AWS側の設定
1. S3バケットの作成
バケット名、リージョンは何でも大丈夫です。
2. IAMポリシーの作成
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::<Your-S3-Bucket-Name>/*"
}
]
}
3. IAMロールの作成
先に作成したポリシーをロールにアタッチします。
また [信頼関係] の [信頼されたエンティティ] として下記信頼ポリシーを設定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::606137763417:root"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "<Your-Contentful-Organization-ID>"
}
}
}
]
}
※ 606137763417
はContentfulのAWSアカウントIDを示す固定値です。
4. S3バケットポリシー
S3 に移動し、バケットポリシーを設定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "<Your-IAM-Role-ARN>"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::<Your-S3-Bucket-Name>/*"
}
]
}
以上でAWS側の設定は完了です。
Contentful側の設定
1. Organziation ダッシュボードのAudit Logsに移動
2. AWSリソース情報の入力
ガイドに従って、先ほど作成したAWSリソースの情報を入力します。
以上で全ての設定は完了です。
注意
- 現時点で、Audit Logsは Orgnization単位 で有効化できます。Space単位で切り出したい場合、自分でデータを加工する必要があります。
- Audit Logsは特定のプランでのみ利用可能です。詳細については弊社までお問い合わせください。